#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include "network.h"

NetWork* open_nw(int type,uint16_t port,const char* ip,bool role)
{
	NetWork* nw = malloc(sizeof(NetWork));
	nw->sockfd = socket(AF_INET,type,0);
	if(0 > nw->sockfd)
	{
		free(nw);
		return NULL;
	}

	// 计算地址结构体的字节数
	nw->addrlen = sizeof(nw->addr);
	
	// 初始化地址结构体
	bzero(&nw->addr,nw->addrlen);
	nw->addr.sin_family = AF_INET;
	nw->addr.sin_port = htons(port);
	nw->addr.sin_addr.s_addr = inet_addr(ip);

	if(role)
	{
		if(bind(nw->sockfd,(SAP)&nw->addr,nw->addrlen))
		{
			free(nw);
			return NULL;
		}

		if(SOCK_STREAM == type && listen(nw->sockfd,16))
		{
			free(nw);
			return NULL;
		}
	}
	else if(SOCK_STREAM == type)
	{
		if(connect(nw->sockfd,(SAP)&nw->addr,nw->addrlen))
		{
			free(nw);
			return NULL;
		}
	}

	nw->type = type;
	nw->role = role;
	return nw;
}

NetWork* accept_nw(NetWork* nw)
{
	if(!nw->role || nw->type != SOCK_STREAM)
		return NULL;
	
	NetWork* cnw = malloc(sizeof(NetWork));
	cnw->addrlen = sizeof(cnw->addr);
	cnw->sockfd = accept(nw->sockfd,(SAP)&cnw->addr,&cnw->addrlen);
	if(0 > cnw->sockfd)
	{
		free(cnw);
		return NULL;
	}

	cnw->type = SOCK_STREAM;
	cnw->role = false;
	return cnw;
}

int send_nw(NetWork* nw,void* buf,size_t len)
{
	if(SOCK_STREAM == nw->type)
		return send(nw->sockfd,buf,len,0);
	else
		return sendto(nw->sockfd,buf,len,0,(SAP)&nw->addr,nw->addrlen);
}

int recv_nw(NetWork* nw,void* buf,size_t len)
{
	if(SOCK_STREAM == nw->type)
		return recv(nw->sockfd,buf,len,0);
	else
		return recvfrom(nw->sockfd,buf,len,0,(SAP)&nw->addr,&nw->addrlen);
}

int close_nw(NetWork* nw)
{
	int ret = close(nw->sockfd);
	free(nw);
	return ret;
}

const char* getip_nw(NetWork* nw)
{
	return inet_ntoa(nw->addr.sin_addr);
}
